package code11_util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;

public class TestDate {
	@Test
	public void f1(){
		// 当前系统时间
		Date d1 = new Date();
		System.out.println(d1);
		// 根据指定的 毫秒值 构建 日期对象
		Date d2 = new Date(1000);
		System.out.println(d2);
		
		// 获取指定日期的 毫秒值
		long time = d1.getTime();
		System.out.println("time:"+time);
		// 设置日期的 毫秒值
		d1.setTime(time + 10*60*1000);// 10分钟后的时间
		System.out.println("10分钟后的时间:" + d1);
		
		// 日期的比较
		Date d3 = new Date(1648002158398L);
		Date d4 = new Date(1648002258398L);
		// after 判断某个日期是否在指定的日期之后
		System.out.println(d3.after(d4));// false
		// before 判断某个日期是否在指定的日期之前
		System.out.println(d3.before(d4));// true
		
		// a.compareTo(b)两个日期进行比较: 
		// 如果 a>b, 返回 1; a<b, 返回 -1; a == b, 返回 0
		System.out.println(d3.compareTo(d4));
	}
	@Test
	public void f2() {
		// 使用 java.text.SimpleDateFormat 进行 Date 与 String 的转换
		// 使用指定的 格式 创建 工具类对象
		String pattern = "yyyy-MM-dd HH:mm:ss.SSS";// 2022-03-23 10:50:33.345
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		// 把 Date 转为 String
		Date d1 = new Date();
		// 使用指定的格式 转换 Date 为 String
		String format = sdf.format(d1);
		System.out.println("d1:"+format);
		
		// 创建工具对象，之后再设置格式
		SimpleDateFormat sdf2 = new SimpleDateFormat();
		// 设置格式
		sdf2.applyPattern("E HH:mm:ss MM月dd日 yyyy年");
		String format2 = sdf2.format(d1);
		System.out.println("format2:"+format2);
		
		sdf2.applyPattern("yyyyMMddHHmmss");
		System.out.println("format3:"+sdf2.format(d1));
		
		System.out.println("-------");
		// 把 String 转为 Date。字符串中的内容格式要和 pattern 相同
		SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		// 2000-02-12 20:10:32 错误内容格式
		String dateStr = "2000/02/12 20:10:32";
		try {
			Date d2 = sdf3.parse(dateStr);
			System.out.println("d2:" + d2);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	// 日期和时间格式，注意大小写. 详细内容在 java.text.SimpleDateFormat API 中
	/* 常见格式：
	 * yyyy 年
	 * MM 月
	 * dd 日
	 * hh 时(12小时制)
	 * HH 时(24小时制)
	 * mm 分
	 * ss 秒
	 * 
	 * S 毫秒
	 * E 星期几
	 * D 一年中的第几天
	 * F 一月中的第几个星期
	 * w 一年中的第几个星期
	 * W 一月中的第几个星期
	 * a 上午或下午的标识
	 * k 和 HH 类似
	 * K 和 hh 类似
	 * z 表示时区
	 */
	
	@Test
	public void t1() {
		Date d = new Date();
		// 获取该日期的下一天的日期
		Date nextDay = getNextDay(d);
		
		System.out.println("----------");
		// 把 String 日期转换为 Date
		String str = "2022年02月30日";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			// 会自动处理时间的 进位
			Date d1 = sdf.parse(str);
			System.out.println("d1:" + d1);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取指定日期的下一天的日期
	 * @param d 日期
	 * @return 下一天的日期
	 */
	public static Date getNextDay(Date d) {
		// 一天的时间
		long one = 24*60*60*1000L;
		long next = d.getTime() + one;
		return new Date(next);
	}
	
	
}
